<?php

/*
  --- PROJECT COFELY 2012, STATISTIEKENRAPPORT PERSOON --
  @author: Leander Molegraaf
  @category: statistieken
  @name DbStatPersoon

  @uses DbStatStatistiekData.php
  @see DbStatProfitcenter.php

  @version 1.1.0
  datum: 10-05-2012

  BESCHRIJVING:
  Deze klasse bevat alle gegevens van 1 persoon
  WERKING:
  Deze klasse wordt aangeroepen met 6 argumenten:
  - de maand van het begin van de periode
  - de jaar van het begin van de periode
  - de maand van het einde van de periode
  - de jaar van het einde van de periode
  - het unieke registratienummer van deze persoon.
  - het type formulier

  CHANGELOG:
  1.1:
  - bug opgelost die in sommige situaties voorkwam dat de juiste statistieken werden geladen
  - SQL aangepast zodat ze gebruik maken van de gewijzigde database structuur.

  1.0.1:
  - comments aangepast
  - naamgeving conform standaarden gemaakt

  1.1.0:
  - nieuw waarde status (zijn er voldoende WPIs/TBMs gevolgd)
  - nieuwe functies calculatePercentage en calculateStatus die de bovenstaande variabel gebruiken.
  - vroeger werdt het 'aantalgoed/slecht/etc.' berekend door die gegevens van alle personen bij elkaar op te tellen.
  in plaats daarvan worden alleen de totalen (hoeveel heeft er voldoende gehouden, hoeveel onvoldoende met reden, etc.)
  - percentages worden ook voor 1 enkele persoon berekend (voor het oproepen van de stats van 1 persoon)

  1.2:
  - benamingen verbeterd
  - gebruik gemaakt van de setters in de parent ipv de variabelen direct aan te passen
  - documentatie geupdate
  - enkele overbodige setters verwijderd.
  - setData hernoemd naar selectData om verwarring te voorkomen.
 */

class DbStatpersoon extends DbStatStatistiekData {

    private $registratieNummer, $WPIplichtig = STAT_BEDRIJFSLAAG_WPIPLICHTIG, $status, $aantalGevolgdPercentage, $aantalGemistPercentage, $aantalGemistMetRedenPercentage; //int
    protected $aantalGevolgd, $aantalGemist, $aantalGemistMetReden;

    /**
     * constructor
     * @param int $beginFilterPeriodeMaand de maand vanaf wanneer gefilterd moet worden
     * @param int $beginFilterPeriodeJaar de jaar vanaf wanneer gefilterd moet worden
     * @param int $eindFilterPeriodeMaand de maand tot wanneer gefilterd moet worden
     * @param int $eindFilterPeriodeJaar de jaar tot wanneer gefilterd moet worden
     * @param int $registratienummer de registratienummer van deze persoon
     * @param String $formuliertype het type formulier(WPI/TBM)
     * @since Version 1.0
     */
    public function __construct($beginFilterPeriodeMaand, $beginFilterPeriodeJaar, $eindFilterPeriodeMaand, $eindFilterPeriodeJaar, $registratieNummer, $inspectieType) {
        $this->setBeginFilterPeriodeJaar($beginFilterPeriodeJaar);
        $this->setEindFilterPeriodeJaar($eindFilterPeriodeJaar);
        $this->setBeginFilterPeriodeMaand($beginFilterPeriodeMaand);
        $this->setEindFilterPeriodeMaand($eindFilterPeriodeMaand);
        $this->setRegistratieNummer($registratieNummer);
        $this->setFormulierType($inspectieType);
        parent::__construct();
        $this->selectData();
        $this->calculateStatus();
    }

    /**
     * haalt gegevens van deze persoon uit de database, en vult de klasse
     * @name selectData
     * @since Version 1.0
     * @return void
     */
    private function selectData() {
        $query = "SELECT naam FROM persoon WHERE registratienummer = " . $this->getRegistratieNummer() . " LIMIT 1";
        if (!$this->dbQuery($query)) {
            $this->setError(DBSTATPERSOON_ERROR_GEENGEBRUIKER);
        }
        $gebruiker = $this->dbFetchArray(); //$row bevat nu  alle gegevens van de gebruiker		
        $this->setNaam($gebruiker['naam']); //set de naam van een gebruiker

        $query2 = "SELECT WPIplichtig, maand FROM persoon_WPI WHERE persoon_registratienummer = " . $this->getRegistratieNummer() . " AND jaar >= " . $this->getBeginFilterPeriodeJaar() . " AND jaar <=" . $this->getEindFilterPeriodeJaar() . " AND maand >= " . ($this->getBeginFilterPeriodeMaand()) . " AND maand <= " . ($this->getEindFilterPeriodeMaand()) . " LIMIT 1";
        if (!$this->dbQuery($query2)) {
            $this->setError(DBSTATPERSOON_ERROR_GEENGEBRUIKERWPI);
        }
        $WPIdata = $this->dbFetchArray();
        $this->WPIplichtig += $WPIdata['WPIplichtig'];

        $query3 = "SELECT inspectie_id, keuring_id FROM inspectie WHERE persoon_registratienummer =" . $this->getRegistratieNummer() . " AND inspectietype ='" . $this->getFormulierType() . "' AND (datum >= STR_TO_DATE('01/" . $this->getBeginFilterPeriodeMaand() . "/" . $this->getBeginFilterPeriodeJaar() . "', '%d/%m/%Y') AND datum <= STR_TO_DATE('30/" . $this->getEindFilterPeriodeMaand() . "/" . $this->getEindFilterPeriodeJaar() . "', '%d/%m/%Y'))";


        if (!$this->dbQuery($query3)) {
            $this->setError(DBSTATPERSOON_ERROR_GEENINSPECTIES . $this->getRegistratieNummer());
        }
        $inspecties = $this->dbFetchAll();


        for ($nummer = 0; $nummer < count($inspecties); $nummer++) { //pakt van elke inspectie die bij dit persoon hoort, de keuring, en voegt deze aan de lijst toe.
            $query4 = "SELECT keuringcol FROM keuring WHERE idkeuring =" . $inspecties[$nummer]['keuring_id'];

            if (!$this->dbQuery($query4)) {
                $this->setError(DBSTATPERSOON_ERROR_GEENKEURING . $inspecties[$nummer]['keuring_id']);
            }
            $keuringen = $this->dbFetchAll();

            for ($nummer2 = 0; $nummer2 < count($keuringen); $nummer2++) {

                switch ($keuringen[$nummer2]['keuringcol']) {
                    case 1://groen
                        $this->aantalGevolgd++;
                        break;

                    case 2://geel
                        $this->aantalGemist++;
                        break;

                    case 3://rood
                        $this->aantalGemistMetReden++;
                        break;
                }
            }
        }

        $totaal = $this->getAantalGevolgd() + $this->getAantalGemist() + $this->getAantalGemistMetReden();
        $this->setAantalGevolgdPercentage($this->calculatePercentage($this->getAantalGevolgd(), $totaal));
        $this->setAantalGemistPercentage($this->calculatePercentage($this->getAantalGemist(), $totaal));
        $this->setAantalGemistMetRedenPercentage($this->calculatePercentage($this->getAantalGemistMetReden(), $totaal));
    }

    /**
     * berekend het percentage dat aantalVanTotaal is tov het totaal
     * @name calculatePercentage
     * @param int $cijferVanTotaal het kleinste getal
     * @param int $totaal het totaal 
     * @since Version 1.1.0
     * @return double $resultaat het resultaat, of 0.
     */
    private function calculatePercentage($cijfer, $totaal) { //int, int
        if ($cijfer > 0) {
            $calc = ($totaal / $cijfer) * 100;
            return(round($calc, 1, PHP_ROUND_HALF_DOWN));
        } else {
            return 0;
        }
    }

    /**
     * berekend de status op basis van hoeveel procent van de TBMs/WPIs er gevolgd is
     * @name calculateStatus
     * @since Version 1.1.0
     * @return double $resultaat het resultaat, of 0.
     */
    private function calculateStatus() { //int
        if ($this->getAantalGevolgdPercentage() >= 90) {
            $this->setStatus(1);
        } else if ($this->getAantalGevolgdPercentage() >= 70 && $this->getAantalGevolgdPercentage() < 90) {
            $this->setStatus(2);
        } else {
            $this->setStatus(3);
        }
    }

    public function getRegistratieNummer() {
        return $this->registratieNummer;
    }

    public function setRegistratieNummer($registratieNummer) {
        $this->registratieNummer = $registratieNummer;
    }

    public function getWPIplichtig() {
        return $this->WPIplichtig;
    }

    public function setWPIplichtig($WPIplichtig) {
        $this->WPIplichtig = $WPIplichtig;
    }

    public function getStatus() {
        return $this->status;
    }

    public function setStatus($status) {
        $this->status = $status;
    }

    public function getAantalGevolgdPercentage() {
        return $this->aantalGevolgdPercentage;
    }

    public function setAantalGevolgdPercentage($aantalGevolgdPercentage) {
        $this->aantalGevolgdPercentage = $aantalGevolgdPercentage;
    }

    public function getAantalGemistPercentage() {
        return $this->aantalGemistPercentage;
    }

    public function setAantalGemistPercentage($aantalGemistPercentage) {
        $this->aantalGemistPercentage = $aantalGemistPercentage;
    }

    public function getAantalGemistMetRedenPercentage() {
        return $this->aantalGemistMetRedenPercentage;
    }

    public function setAantalGemistMetRedenPercentage($aantalGemistMetRedenPercentage) {
        $this->aantalGemistMetRedenPercentage = $aantalGemistMetRedenPercentage;
    }

    public function getAantalGevolgd() {
        return $this->aantalGevolgd;
    }

    public function setAantalGevolgd($aantalGevolgd) {
        $this->aantalGevolgd = $aantalGevolgd;
    }

    public function getAantalGemist() {
        return $this->aantalGemist;
    }

    public function setAantalGemist($aantalGemist) {
        $this->aantalGemist = $aantalGemist;
    }

    public function getAantalGemistMetReden() {
        return $this->aantalGemistMetReden;
    }

    public function setAantalGemistMetReden($aantalGemistMetReden) {
        $this->aantalGemistMetReden = $aantalGemistMetReden;
    }

}

?>